package main

import (
	"fmt"
)

func main() {
	// 定义变量
	var (
		name, sex                  string
		sexWeight, age             int
		height, weight, fatRateSum float64
		result, suggestion         string
		info                       [5]interface{}    // 0: name, 1: bmi, 2:fat_rate, 3: result, 4: suggestion
		totalInfo                  [3][5]interface{} // 存储 info 数组，容量影响程序能录入的总人数
	)
	fmt.Println("**************")
	fmt.Println("* 体脂计算器 *")
	fmt.Println("**************")

	// 开始输入采集数据，并计算bmi与体脂率，最终得到建议
	personNum := len(totalInfo)
	fmt.Println("======= 录入信息 =======")
	for i := 0; i < personNum; i++ {
		fmt.Printf("输入第 %v 个人的信息\n", i+1)
		fmt.Print("姓名：")
		_, err := fmt.Scanln(&name)
		if err != nil {
			panic(err)
		}

		fmt.Print("性别（男/女）：")
		_, err2 := fmt.Scanln(&sex)
		if err2 != nil {
			panic(err2)
		}

		// 根据输入的性别给 sexWeight 赋值
	checkSex:
		for {
			switch sex {
			case "男":
				sexWeight = 1
				break checkSex
			case "女":
				sexWeight = 0
				break checkSex
			default:
				fmt.Print("只能输入（男/女），重新输入：")
				_, err3 := fmt.Scanln(&sex)
				if err3 != nil {
					panic(err3)
				}
			}
		}

		fmt.Print("年龄：")
		_, err4 := fmt.Scanln(&age)
		if err4 != nil {
			panic(err4)
		}

		fmt.Print("身高（米）：")
		_, err5 := fmt.Scanln(&height)
		if err5 != nil {
			panic(err5)
		}

		fmt.Print("体重（公斤）：")
		_, err6 := fmt.Scanln(&weight)
		if err6 != nil {
			panic(err6)
		}

		// 计算 bmi 体脂率
		bmi := weight / (height * height)
		fatRate := 1.2*bmi + 0.23*float64(age) - 5.4 - 10.8*float64(sexWeight)
		fatRateSum += fatRate

		// 得出体重结论和建议
		// 体重结论随年龄偏移。所以用 offset 偏移量节省代码
		var offset float64
		switch sex {
		case "男":
			if age >= 18 && age < 40 {
				offset = 0
			} else if age >= 40 && age < 60 {
				offset = 1
			} else if age >= 60 {
				offset = 3
			}
			fatRateOffSet := fatRate - offset
			if fatRateOffSet >= 0 && fatRateOffSet < 10 {
				result = "偏瘦"
			} else if fatRateOffSet >= 10 && fatRateOffSet < 16 {
				result = "标准"
			} else if fatRateOffSet >= 16 && fatRateOffSet < 21 {
				result = "偏重"
			} else if fatRateOffSet >= 21 && fatRateOffSet < 26 {
				result = "肥胖"
			} else if fatRateOffSet >= 26 {
				result = "严重肥胖"
			} else {
				fmt.Println("体脂率为负数，好像输入的数据不对呢")
			}
		case "女":
			if age >= 18 && age < 40 {
				offset = 0
			} else if age >= 40 && age < 60 {
				offset = 1
			} else if age >= 60 {
				offset = 2
			}
			fatRateOffSet := fatRate - offset
			if fatRateOffSet >= 0 && fatRateOffSet < 20 {
				result = "偏瘦"
			} else if fatRateOffSet >= 20 && fatRateOffSet < 27 {
				result = "标准"
			} else if fatRateOffSet >= 27 && fatRateOffSet < 34 {
				result = "偏重"
			} else if fatRateOffSet >= 34 && fatRateOffSet < 39 {
				result = "肥胖"
			} else if fatRateOffSet >= 39 {
				result = "严重肥胖"
			} else {
				fmt.Println("体脂率为负数，好像输入的数据不对呢")
			}
		}
		// 根据结论，得到建议
		switch result {
		case "偏瘦":
			suggestion = "多补充营养"
		case "标准":
			suggestion = "太棒了，继续保持"
		case "偏重":
			suggestion = "需要加强锻炼"
		case "肥胖":
			suggestion = "开始计划锻炼，得减重了"
		case "严重肥胖":
			suggestion = "警告！必须制定计划，恢复健康"
		default:
			suggestion = "未匹配到体重结论，请联系作者"
		}
		// 存入信息数组
		info[0], info[1], info[2], info[3], info[4] = name, bmi, fatRate, result, suggestion
		// 将单个信息数组存入汇总信息数组
		totalInfo[i] = info
		fmt.Println()
	}
	// 打印结论和建议
	println("======= 个人体脂信息及建议 =======")
	for _, info := range totalInfo {
		fmt.Printf("姓名：%s BMI：%.1f 体脂率：%.1f%%\n结论及建议：%s，%s\n\n", info[0], info[1], info[2], info[3], info[4])
	}
	// 总数据统计
	fmt.Printf("======= 汇总报告 =======\n录入总人数：%d\n平均体脂率：%.1f%%\n", len(totalInfo), fatRateSum/float64(len(totalInfo)))
}
